# -*- mode: python; python-indent: 4 -*-
import ncs
from ncs.application import Service
import ncs.template
from netaddr import *

class ServiceCallbacks(Service):

    @Service.create
    def cb_create(self, tctx, root, service, proplist):
        self.log.info('L3VPN Service Create Starting for: (service=', service._path, ')')

        vpn_vars = ncs.template.Variables()
        template = ncs.template.Template(service)

        vpn_vars.add('VPN_NAME', service.vpn_name)
        vpn_vars.add('VPN_ID', service.vpn_id)

        for site in service.site:
            
            vpn_vars.add('SITE_ID', site.site_id)
            vpn_vars.add('CE', site.ce)

            for llink in site.lan_link:
                vpn_vars.add('CE_LOCAL_IF', llink.lan_interface_name)
                ip = IPNetwork(llink.lan_ip)
                vpn_vars.add('CE_LOCAL_IF_ADDR', ip.ip)
                vpn_vars.add('CE_LOCAL_IF_NET', ip.network)
                vpn_vars.add('CE_LOCAL_IF_MASK', ip.netmask)

	        vpn_vars.add('SEQ', ip.network.value)
                vpn_vars.add('PREFIX', str(ip.network) + '/' + str(ip.prefixlen))
                template.apply('IAP Artifact l3vpn-ce-local-link', vpn_vars)

            for wlink in site.wan_link:
                vpn_vars.add('PE', wlink.pe)
                vpn_vars.add('VLAN', wlink.vlan)
                vpn_vars.add('PE_AS', wlink.pe_as_num)
                ip = IPNetwork(wlink.pe_router_ip)
                vpn_vars.add('PE_RID', ip.ip)
                vpn_vars.add('PE_IF', wlink.pe_interface_name)
                ip = IPNetwork(wlink.pe_ip)
                vpn_vars.add('PE_IF_ADDR', ip.ip)
                vpn_vars.add('PE_IF_NET', ip.network)
                vpn_vars.add('PE_IF_MASK', ip.netmask)
                vpn_vars.add('PE_IF_MASKLEN', ip.prefixlen)
                vpn_vars.add('CE_WAN_IF', wlink.ce_wan_interface_name)
                ip = IPNetwork(wlink.ce_wan_ip)
                vpn_vars.add('CE_WAN_IF_ADDR', ip.ip)
                vpn_vars.add('CE_WAN_IF_NET', ip.network)
                vpn_vars.add('CE_WAN_IF_MASK', ip.netmask)

	        vpn_vars.add('SEQ', ip.network.value)
                vpn_vars.add('PREFIX', str(ip.network) + '/' + str(ip.prefixlen))

                self.log.info('Applying CE template for device', site.ce)
                template.apply('IAP Artifact l3vpn-ce', vpn_vars)

                for r_site in service.site:
                    if r_site.site_id != site.site_id:
                        for r_wlink in r_site.wan_link:
                            ip = IPNetwork(r_wlink.pe_router_ip)
                            vpn_vars.add('REMOTE_PE_RID', ip.ip)
                            template.apply('IAP Artifact l3vpn-pe-rt', vpn_vars)
				
                self.log.info('Applying PE template for device ', wlink.pe)
                template.apply('IAP Artifact l3vpn-pe', vpn_vars)

        self.log.info('L3VPN Service Create Ending for: (service=', service._path, ')')

# ---------------------------------------------
# COMPONENT THREAD THAT WILL BE STARTED BY NCS.
# ---------------------------------------------
class L3vpn(ncs.application.Application):
    def setup(self):
        self.log.info('L3VPN setup')
        self.register_service('IAP-Artifact-l3vpn-servicepoint', ServiceCallbacks)

    def teardown(self):
        self.log.info('L3VPN teardown')
